package com.gitee.huanminabc.utils_common.multithreading.queue.trait;
import com.gitee.huanminabc.jcommon.exception.CommonException;

import java.util.concurrent.SynchronousQueue;
import java.util.function.Consumer;


//专门为生成者和消费者提供的队列,  生产一个必须被消费了才能继续生产,  也就是始终只能一个值在队列中,
// 如果对速度没太大要求的话我们可以用来在线程间安全的交换单一元素,这样好处就是降低吞吐量,对系统cpu等性能影响较低,
// 如果需要快速处理的话选择可以使用LinkedTransferQueueUtils,来加快处理
public class SynchronousQueueUtil<T> {
    private final SynchronousQueue<T>  synchronousQueue=new SynchronousQueue<T>();
    //立即将元素推送给消费者,如果没有消费,那么会一直阻塞,直到有消费者为止
    public void produce(T data) {
        try {
            synchronousQueue.put(data);
        } catch (InterruptedException e) {
            throw new CommonException(e);
        }
    }

    //从队列中取出一个值,如果没有值那么一直阻塞到有为止,然后进行处理
    public void consume(Consumer<T> consumer) {
        try {
            consumer.accept(synchronousQueue.take());
        } catch (InterruptedException e) {
            throw new CommonException(e);
        }
    }



}
